#ifndef HTTP_CONN
#define HTTP_CONN 1
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <mutex>
#include "httprequest.h"
#include "httpresponce.h"
//如果 fd 为ET模式则需要一次性读取完毕,边沿模式下读取完毕时 会将errno置为 EAGIN
//如果 fd 为LT模式则读取一次就完毕
//向 fd 写入相应报文
//为避免报文过长，采用 struct iovec结构多路写入
//如何将 经解析后组成的响应报文写进fd? 
//为避免 页面过长 
//采用 writev 多路写 多路读
class Httpconn
{
public:
    Httpconn();
    ~Httpconn();
    void init(int fd,const sockaddr_in& client);
    void Close();

    ssize_t read(int* Errno);
    ssize_t write(int* Errno);

    int getFd();
    const char * getIP();
    uint16_t getPort();
    void getAddr(sockaddr_in& sockaddr);
    bool process();    

    //写的总长度 2块缓存
    int TotalWBytes()
    {
        return io_[0].iov_len + io_[1].iov_len;
    }
    bool IsKeepAlive()
    {
        return reques_.isKeepAlive();
    }
    static bool isET_;
    static char *srcDir_;
    static std::atomic<int> usercount_;

private:
    int fd_;
    int iocnt_;
    bool isclose_;

    /* Structure for scatter/gather I/O.  */
    struct iovec io_[2];
    struct sockaddr_in Client_;

    Buffer_::Buffer readBuff_;
    Buffer_::Buffer writeBuff_;

    HttpRequest reques_;
    Httpresponce respon_;
};
#endif